// 定义包名，类似于文件夹结构，方便组织代码
package flutter.plugins.contactsservice.contactsservice;

// 导入ArrayList类，用于存储多个相同类型的对象
import java.util.ArrayList;
// 导入HashMap类，用于存储键值对数据
import java.util.HashMap;

/**
 * 联系人数据模型类
 * 实现Comparable接口，使其可以进行排序
 */
public class Contact implements Comparable<Contact> {

    /**
     * 构造函数1：通过ID创建联系人
     * @param id 联系人的唯一标识符
     */
    Contact(String id) {
        // 将传入的ID赋值给对象的identifier属性
        this.identifier = id;
    }

    /**
     * 私有构造函数2：用于fromMap方法内部创建对象
     * 外部无法直接调用
     */
    private Contact() {
    }

    // 联系人的唯一标识符
    String identifier;
    // 联系人的各种信息字段
    String displayName; // 显示名称
    String givenName; // 名字
    String middleName; // 中间名
    String familyName; // 姓氏
    String prefix; // 称谓前缀(如Mr., Dr.)
    String suffix; // 称谓后缀(如Jr., PhD)
    String company; // 公司
    String jobTitle; // 职位
    String note; // 备注
    String birthday; // 生日
    String androidAccountType; // Android账户类型
    String androidAccountName; // Android账户名称

    // 存储多个邮箱地址的列表
    ArrayList<Item> emails = new ArrayList<>();
    // 存储多个电话号码的列表
    ArrayList<Item> phones = new ArrayList<>();
    // 存储多个邮寄地址的列表
    ArrayList<PostalAddress> postalAddresses = new ArrayList<>();
    // 头像数据，初始化为空字节数组
    byte[] avatar = new byte[0];

    /**
     * 将联系人对象转换为HashMap格式
     * 目的是方便传递给Flutter端使用
     * @return 包含所有联系人信息的HashMap
     */
    HashMap<String, Object> toMap() {
        // 创建一个空的HashMap
        HashMap<String, Object> contactMap = new HashMap<>();

        // 将联系人的基本信息添加到HashMap中
        contactMap.put("identifier", identifier);
        contactMap.put("displayName", displayName);
        contactMap.put("givenName", givenName);
        contactMap.put("middleName", middleName);
        contactMap.put("familyName", familyName);
        contactMap.put("prefix", prefix);
        contactMap.put("suffix", suffix);
        contactMap.put("company", company);
        contactMap.put("jobTitle", jobTitle);
        contactMap.put("avatar", avatar);
        contactMap.put("note", note);
        contactMap.put("birthday", birthday);
        contactMap.put("androidAccountType", androidAccountType);
        contactMap.put("androidAccountName", androidAccountName);

        // 处理邮箱列表
        ArrayList<HashMap<String, String>> emailsMap = new ArrayList<>();
        // 遍历所有邮箱，转换为Map格式
        for (Item email : emails) {
            emailsMap.add(email.toMap());
        }
        // 将邮箱Map列表添加到联系人Map中
        contactMap.put("emails", emailsMap);

        // 处理电话列表（与邮箱类似）
        ArrayList<HashMap<String, String>> phonesMap = new ArrayList<>();
        for (Item phone : phones) {
            phonesMap.add(phone.toMap());
        }
        contactMap.put("phones", phonesMap);

        // 处理地址列表（与邮箱类似）
        ArrayList<HashMap<String, String>> addressesMap = new ArrayList<>();
        for (PostalAddress address : postalAddresses) {
            addressesMap.add(address.toMap());
        }
        contactMap.put("postalAddresses", addressesMap);

        // 返回完整的联系人Map
        return contactMap;
    }

    /**
     * 从HashMap创建联系人对象
     * 目的是从Flutter端接收数据并转换为Android可用的对象
     * @SuppressWarnings("unchecked") 忽略未经检查的类型转换警告
     * @param map 包含联系人信息的HashMap
     * @return 创建的联系人对象
     */
    @SuppressWarnings("unchecked")
    static Contact fromMap(HashMap map) {
        // 创建一个新的联系人对象
        Contact contact = new Contact();

        // 从Map中获取基本信息并设置到联系人对象
        contact.identifier = (String) map.get("identifier");
        contact.givenName = (String) map.get("givenName");
        contact.middleName = (String) map.get("middleName");
        contact.familyName = (String) map.get("familyName");
        contact.prefix = (String) map.get("prefix");
        contact.suffix = (String) map.get("suffix");
        contact.company = (String) map.get("company");
        contact.jobTitle = (String) map.get("jobTitle");
        contact.avatar = (byte[]) map.get("avatar");
        contact.note = (String) map.get("note");
        contact.birthday = (String) map.get("birthday");
        contact.androidAccountType = (String) map.get("androidAccountType");
        contact.androidAccountName = (String) map.get("androidAccountName");

        // 处理邮箱列表
        ArrayList<HashMap> emails = (ArrayList<HashMap>) map.get("emails");
        if (emails != null) { // 检查是否有邮箱数据
            // 遍历邮箱列表，转换每个邮箱为Item对象并添加到联系人
            for (HashMap email : emails) {
                contact.emails.add(Item.fromMap(email));
            }
        }

        // 处理电话列表（与邮箱类似）
        ArrayList<HashMap> phones = (ArrayList<HashMap>) map.get("phones");
        if (phones != null) {
            for (HashMap phone : phones) {
                contact.phones.add(Item.fromMap(phone));
            }
        }

        // 处理地址列表（与邮箱类似）
        ArrayList<HashMap> postalAddresses = (ArrayList<HashMap>) map.get("postalAddresses");
        if (postalAddresses != null) {
            for (HashMap postalAddress : postalAddresses) {
                contact.postalAddresses.add(PostalAddress.fromMap(postalAddress));
            }
        }

        // 返回创建的联系人对象
        return contact;
    }

    /**
     * 比较两个联系人对象，用于排序
     * 按照名字的字母顺序排序
     * @param contact 要比较的另一个联系人
     * @return 比较结果：负数表示当前联系人在前，0表示相等，正数表示当前联系人在后
     */
    @Override
    public int compareTo(Contact contact) {
        // 获取当前联系人的名字，如果为空则使用空字符串，并转换为小写（忽略大小写排序）
        String givenName1 = this.givenName == null ? "" : this.givenName.toLowerCase();
        // 获取另一个联系人的名字，处理可能为null的情况
        String givenName2 = contact == null ? ""
                : (contact.givenName == null ? "" : contact.givenName.toLowerCase());
        // 调用String的compareTo方法进行字母顺序比较
        return givenName1.compareTo(givenName2);
    }
}